/*
 * @文件描述:
 * @公司: 山东大学信息学院
 * @作者: 宋益强
 * @Date: 2019-09-17 10:24:35
 * @LastEditors: 李洪文
 * @LastEditTime: 2020-10-09 18:14:22
 */

import {
  NavigationActions,
  StackActions,
  NavigationAction,
  NavigationParams,
  NavigationContainerComponent,
  SwitchActions,
} from 'react-navigation';

/** navigator 实例 */
let _navigator: NavigationContainerComponent;

/**
 * Set navigator 实例
 * @param navigatorRef navigator实例
 */
const setTopLevelNavigator = (navigatorRef: NavigationContainerComponent) =>
  (_navigator = navigatorRef);

/**
 * dispatch 路由 Action
 * @param action 路由 Action
 */
const dispatch = (action: NavigationAction) => {
  _navigator && _navigator.dispatch(action);
};

/**
 * 路由跳转
 * @param routeName 要跳转的路由名称
 * @param params 跳转参数
 */
const navigate = (routeName: string, params?: NavigationParams) => {
  dispatch(NavigationActions.navigate({routeName, params}));
};

/**
 * 路由跳转
 * 与navigate的区别在于:
 * 如果有已经加载的页面，navigate方法将跳转到已经加载的页面，而不会重新创建一个新的页面
 * push 总是会创建一个新的页面，所以一个页面可以被多次创建
 * @param routeName 要跳转的路由名称
 * @param params 跳转参数
 */
const push = (routeName: string, params?: NavigationParams) => {
  dispatch(StackActions.push({routeName, params}));
};

/**
 * 路由 pop
 * @param n 要pop的层数
 */
const pop = (n = 1, params: {immediate?: boolean} = {}) => {
  dispatch(StackActions.pop({n, ...params}));
};

/**
 * Switch 切换
 * @param arg
 */
const jumpTo = (arg: {
  routeName: string;
  key: string;
  params?: NavigationParams;
}) => {
  // 官方文档中key属性是可选的, 在types里成了必选的, 猜测可能是types定义错了, 抽个空去提pr
  dispatch(SwitchActions.jumpTo(arg));
};

export default {
  setTopLevelNavigator,
  dispatch,
  navigate,
  push,
  pop,
  jumpTo,
};
